<?php

global $strGPrefix;
global $strGPath  ;

require_once(BaseConfig::LoadClass('conecta.class.php'));

if(!isset($__strDefaulFilesToSearch)) {
  $__strDefaulFilesToSearch = $strGBaseDirTop . "/main.inc.php;index.php";
} else {
  if(strpos($__strDefaulFilesToSearch, $strGBaseDirTop . "/main.inc.php") === false) {
    $__strDefaulFilesToSearch = $strGBaseDirTop . "/main.inc.php;" . $__strDefaulFilesToSearch;
  }
}

class Permiso {
  /**
   * Funcion que normaliza las entradas de un case para que queden de la manera:
   * 
   * case 'opcion': // Nombre Opcion
   * 
   * aun cuando esten de la manera:
   * 
   * case 'opcion'  : // Ajale
   * case 'opcion':   // Jalea
   * case 'opcion':   // Jalea
   * case 'opcion' :  // Jalalai
   * 
   * @param string $strLinea    Linea, que comienza con "case '", que se normalizara
   * @param char   $strTipoCase Tipo de case (Puede ser '"' o "'")
   */
  static function __QuitarEspaciosEnCase($strLinea, $strTipoCase) {
    // Quitar los espacios repetidos para poder buscar los case con varios espacios.
    // Esto funciona porque ya sabemos que esta linea es un CASE
    $strLinea = Variables::QuitarEspaciosRepetidos($strLinea);
    // Quitar el espacio entre el "'" y el ":", para buscar posibles CASE que tengan espacios entre el "'" y el ":"
    $strLinea = str_replace("$strTipoCase :", "$strTipoCase:", $strLinea);
    
    return $strLinea;
  }
  /**
   * Lee las opciones CASE del index y las ordena para mostrarlas en los menus. 
   *
   * @staticvar Array $arrRet arreglo con las opciones a regresar. Estatico para que solo se genere una vez.
   * 
   * @return Array Arreglo con los permisos posibles
   */
  static function ObtenerPermisosMenu($intArchivoIndice = "defaultFiles") {
    if($intArchivoIndice == "defaultFiles") {
      global $__strDefaulFilesToSearch;
      $intArchivoIndice = $__strDefaulFilesToSearch;
    }
    
    static $arrRet = 0;
    
    if($arrRet == 0) {
      $arrRet = array();

      $arrArchivos = explode(';', $intArchivoIndice);
      foreach($arrArchivos as $arrSource) {
        $arrLineasArchivo = file($arrSource, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach($arrLineasArchivo as $strLinea) {
          $strLinea = trim($strLinea);
          if(substr($strLinea, 0, strlen("case '")) == "case '") {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, "'");
            
            $arrDatos = explode("': //", substr($strLinea, strlen("case '")));
            if(!isset($arrDatos[1])) $arrDatos[1] = "";
            
            if((substr(trim($arrDatos[1]), 0, 1) == "+") || (substr(trim($arrDatos[1]), 0, 1) == "*") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
            }
            if(substr(trim($arrDatos[1]), 0, 1) == "[") {
              $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
              $arrDatos[1] = substr(trim($arrDatos[1]), 3);
              
              $arrRet[$arrDatos[2]][$arrDatos[0]] = trim($arrDatos[1]);
            }
          } else if(substr($strLinea, 0, strlen('case "')) == 'case "') {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, '"');
            
            $arrDatos = explode('": //', substr($strLinea, strlen('case "')));
            if(count($arrDatos) == 1) continue;
            if((substr(trim($arrDatos[1]), 0, 1) == "+") || (substr(trim($arrDatos[1]), 0, 1) == "*") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
            }
            if(substr(trim($arrDatos[1]), 0, 1) == "[") {
              $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
              $arrDatos[1] = substr(trim($arrDatos[1]), 3);
              $arrRet[$arrDatos[2]][$arrDatos[0]] = trim($arrDatos[1]);
            }
          }
        }
      }
    }
    
    return $arrRet;
  }

  /**
   * Lee las opciones CASE del index. 
   * Solo leé las que tienen CASE ', no las CASE ",
   * las cuales deberían de ser tratadas como globales
   * y accesibles para todos los usuario
   *
   * Las opciones adicionales, que indican a que perfil van predefinido, se enmarcan con un + para usuario, un * para administrador, un - para ambos
   *
   * @staticvar Array $arrRet arreglo con las opciones a regresar. Estatico para que solo se genere una vez.
   * 
   * @return Array Arreglo con los permisos posibles
   */
  static function ObtenerPermisosPosibles($intArchivoIndice = "defaultFiles", $bolIncluirPermisosGlobales = false) {
    if($intArchivoIndice == "defaultFiles") {
      global $__strDefaulFilesToSearch;
      $intArchivoIndice = $__strDefaulFilesToSearch;
    }
    
    static $arrRet = 0;
    
    if($arrRet == 0) {
      $arrRet = array();

      $arrArchivos = explode(';', $intArchivoIndice);
      foreach($arrArchivos as $arrSource) {
        $arrLineasArchivo = file($arrSource, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach($arrLineasArchivo as $strLinea) {
          $strLinea = trim($strLinea);
          if(substr($strLinea, 0, strlen("case '")) == "case '") {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, "'");
            
            $arrDatos = explode("': //", substr($strLinea, strlen("case '")));
            if(!isset($arrDatos[1])) $arrDatos[1] = "";
            if((substr(trim($arrDatos[1]), 0, 1) == "+") || (substr(trim($arrDatos[1]), 0, 1) == "*") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
            }
            if(substr(trim($arrDatos[1]), 0, 1) == "[") {
              $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
              $arrDatos[1] = substr(trim($arrDatos[1]), 3);
            }
            $arrRet[$arrDatos[0]] = trim($arrDatos[1]);
          } else if($bolIncluirPermisosGlobales && (substr($strLinea, 0, strlen('case "')) == 'case "')) {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, '"');
            
            $arrDatos = explode('": //', substr($strLinea, strlen('case "')));
            if(count($arrDatos) == 1) continue;
            if((substr(trim($arrDatos[1]), 0, 1) == "+") || (substr(trim($arrDatos[1]), 0, 1) == "*") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
            }
            if(substr(trim($arrDatos[1]), 0, 1) == "[") {
              $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
              $arrDatos[1] = substr(trim($arrDatos[1]), 3);
            }
            $arrRet[$arrDatos[0]] = trim($arrDatos[1]);
          }
        }
      }
    }
    return $arrRet;
  }

  /**
   * @global Sesion $oSesion
   */
  static function ObtenerPermisosGlobales($intArchivoIndice = "defaultFiles") {
    global $oSesion;
    
    if($intArchivoIndice == "defaultFiles") {
      global $__strDefaulFilesToSearch;
      $intArchivoIndice = $__strDefaulFilesToSearch;
    }
    
    static $arrRet = 0;
    
    if($arrRet == 0) {
      $arrRet = array();

      $arrArchivos = explode(';', $intArchivoIndice);
      foreach($arrArchivos as $strSource) {
        $arrLineasArchivo = file($strSource, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach($arrLineasArchivo as $strLinea) {
          $strLinea = trim($strLinea);
          if(substr($strLinea, 0, strlen('case "')) == 'case "') {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, '"');
            
            $arrDatos = explode('": //', substr($strLinea, strlen('case "')));
            if(count($arrDatos) == 1) continue;
            if((substr(trim($arrDatos[1]), 0, 1) == "+") || (substr(trim($arrDatos[1]), 0, 1) == "*") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
            }
            if(substr(trim($arrDatos[1]), 0, 1) == "[") {
              $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
              $arrDatos[1] = substr(trim($arrDatos[1]), 3);
            }
            $arrRet[$arrDatos[0]] = trim($arrDatos[1]);
          }
        }
      }
      
      if(!$oSesion->oUsuario->intIdUsuario) {
        // No es un usuario logueado, por lo que no puede ver la opcion de salir del sistema ni la de ver el showcase del tema
        unset($arrRet["salir"]);
        unset($arrRet["theme_showcase"]);
      }
    }
    return $arrRet;
  }

  /**
   * Función que obtiene los permisos recomendados para el administrador.
   * 
   * @staticvar Array $arrRet arreglo con las opciones a regresar. Estatico para que solo se genere una vez.
   *
   * @return Array Arreglo con los permisos posibles
   */
  static function ObtenerPermisosRecomendadosAdmin($intArchivoIndice = "defaultFiles") {
    if($intArchivoIndice == "defaultFiles") {
      global $__strDefaulFilesToSearch;
      $intArchivoIndice = $__strDefaulFilesToSearch;
    }
    
    static $arrRet = 0;

    if($arrRet == 0) {
      $arrRet = array();
      $arrArchivos = explode(';', $intArchivoIndice);
      foreach($arrArchivos as $arrSource) {
        $arrLineasArchivo = file($arrSource, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach($arrLineasArchivo as $strLinea) {
          $strLinea = trim($strLinea);
          if(substr($strLinea, 0, strlen("case '")) == "case '") {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, "'");
            
            $arrDatos = explode("': //", substr($strLinea, strlen("case '")));
            if(!isset($arrDatos[1])) $arrDatos[1] = "";
            if((substr(trim($arrDatos[1]), 0, 1) == "*") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
              
              if(substr(trim($arrDatos[1]), 0, 1) == "[") {
                $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
                $arrDatos[1] = substr(trim($arrDatos[1]), 3);
              }
              
              $arrRet[$arrDatos[0]] = trim($arrDatos[1]);
            }
          }
        }
      }
    }
    return $arrRet;
  }
  
  /**
   * Función que obtiene los permisos recomendados para el usuario normal.
   *
   * @staticvar Array $arrRet arreglo con las opciones a regresar. Estatico para que solo se genere una vez.
   *
   * @return Array Arreglo con los permisos posibles
   */
  static function ObtenerPermisosRecomendadosNormal($intArchivoIndice = "defaultFiles") {
    if($intArchivoIndice == "defaultFiles") {
      global $__strDefaulFilesToSearch;
      $intArchivoIndice = $__strDefaulFilesToSearch;
    }
    
    static $arrRet = 0;

    if($arrRet == 0) {
      $arrRet = array();
      $arrArchivos = explode(';', $intArchivoIndice);
      foreach($arrArchivos as $arrSource) {
        $arrLineasArchivo = file($arrSource, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        foreach($arrLineasArchivo as $strLinea) {
          $strLinea = trim($strLinea);
          if(substr($strLinea, 0, strlen("case '")) == "case '") {
            $strLinea = Permiso::__QuitarEspaciosEnCase($strLinea, "'");
            
            $arrDatos = explode("': //", substr($strLinea, strlen("case '")));
            if(!isset($arrDatos[1])) $arrDatos[1] = "";
            if((substr(trim($arrDatos[1]), 0, 1) == "+") || (substr(trim($arrDatos[1]), 0, 1) == "-")) {
              $arrDatos[1] = substr(trim($arrDatos[1]), 1);
              
              if(substr(trim($arrDatos[1]), 0, 1) == "[") {
                $arrDatos[2] = substr(trim($arrDatos[1]), 1, 1);
                $arrDatos[1] = substr(trim($arrDatos[1]), 3);
              }
              
              $arrRet[$arrDatos[0]] = trim($arrDatos[1]);
            }
          }
        }
      }
    }
    return $arrRet;
  }

  /**
   * Función que obtiene el template HTML con los permisos de un usuario.
   *
   * @param int $intIdUsuario ID del usuario de quien se obtendrá el template
   *
   * @return String Template en HTML
   */
  static function ObtenerTemplatePermisos($intIdUsuario) {
    $arrPermisos        = Permiso::ObtenerPermisosPosibles();
    $arrOpcionesUsuario = Permiso::ObtenerPermisosUsuario ($intIdUsuario);
    
    $arrValoresExtra    = array();
    $arrValoresExtra["PermisoDefaultUsuario-$intIdUsuario"] = Permiso::ObtenerPermisosRecomendadosNormal();
    $arrValoresExtra["PermisoDefaultAdmin-$intIdUsuario"  ] = Permiso::ObtenerPermisosRecomendadosAdmin ();
    $arrValoresExtra["PermisoCompletos-$intIdUsuario"     ] = Permiso::ObtenerPermisosPosibles          ();
    
    return Variables::GetCheckboxesByArray($arrPermisos, $arrOpcionesUsuario, "permisos[]", 3, false, "style='white-space:nowrap;'", $arrValoresExtra, 35);
  }

  /**
   * Función que obtiene los permisos de un usuario en especifico.
   *
   * @param int $intIdUsuario ID del usuario
   *
   * @return Array Arreglo con los permisos del usuario
   */
  static function ObtenerPermisosUsuario($intIdUsuario) {
    global $strGPrefix;
    
    $oConecta           = new Conecta();
    $strConsulta        = "SELECT {$strGPrefix}permiso FROM permisos WHERE id_usuario = " . ($intIdUsuario - 0);
    $arrOpcionesUsuario = array();
    
    $oConecta->Consulta($strConsulta);
    while(!$oConecta->EOF) {
      $arrOpcionesUsuario[] = $oConecta->Field("permiso");
      $oConecta->MoveNext();
    }
    
    return $arrOpcionesUsuario;
  }

  /**
   * Función que guarda los permisos de un usuario. Si el usuario ya tiene
   * permisos antes, se le borrarán para agregar despues los permisos nuevos.
   *
   * @param int   $intIdUsuario ID del usuario a quien se le guardarán los permisos.
   * @param Array $arrPermisos  Arreglo con los permisos en el formatp $arr['nombre_permiso'] = 0|1
   */
  static function GuardarPermisos($intIdUsuario, $arrPermisos) {
    global      $strGPrefix;
    $oConecta = new Conecta();
    
    $strConsulta = "DELETE FROM {$strGPrefix}permisos WHERE id_usuario = " . ($intIdUsuario - 0);
    $oConecta->Consulta($strConsulta);
    
    foreach($arrPermisos as $strPermiso) {
      $strConsulta = "INSERT INTO {$strGPrefix}permisos (id_usuario, permiso) VALUES (" . ($intIdUsuario - 0) . ", '$strPermiso')";
      $oConecta->Consulta($strConsulta);
    }
  }

  /**
   * Función que verifica si un usuario tiene un permiso en específico
   *
   * @param int    $intIdUsuario ID del usuario de quien se checará el permiso
   * @param String $strPermiso   Cadena con el nombre del permiso a checar
   *
   * @return Boolean True si el usuario cuenta con el permiso, False si no
   */
  static function TienePermiso($intIdUsuario, $strPermiso) {
    global      $strGPrefix;
    $oConecta = new Conecta();
    
    $arrP = Permiso::ObtenerPermisosGlobales();
    prent_r($arrP);
    
    $strConsulta = "SELECT * FROM {$strGPrefix}permisos WHERE id_usuario = " . ($intIdUsuario - 0) . " AND permiso = '$strPermiso'";
    $oConecta->Consulta($strConsulta);
    
    if($oConecta->EOF) {
      return false;
    } else {
      return true;
    }
  }
}

?>